package com.os.sys.service.bean;

import com.os.sys.pojo.SysMenu;
import com.os.sys.pojo.SysOrg;
import com.os.sys.pojo.SysRole;
import com.os.sys.pojo.SysUser;
import com.os.util.BPConstants;
import com.os.util.Tools;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

//import com.os.sys.service.OperBO;
//import com.os.sys.service.UserBO;
//import com.os.util.BPConfiguration;
//import com.os.util.BPConstants;

public class UserInfo   implements Serializable{
	private static final long serialVersionUID = 1L; 
	private SysOrg com = new SysOrg();
	
//	//当前用户登陆时选择的公司
//	private int org_id_com = 0 ;
//	private String org_name_com = "" ;
//	
	/**
	 * 取当前用户登记时所使用的公司ID
	 * @return
	 */
	public int getCom_id() {
		return com.getOrg_id();
	}
//
//	public void setOrg_id_com(int org_id_com) {
//		this.org_id_com = org_id_com;
//	}
//	
	/**
	 * 取当前用户登记时所使用的公司名
	 * @return
	 */
	public String getCom_name() {
		return com.getOrg_name();
	}
//
//	public void setOrg_name_com(String org_name_com) {
//		this.org_name_com = org_name_com;
//	}

	public SysOrg getCom() {
		return com;
	}

	public void setCom(SysOrg com) {
		this.com = com;
	}
	public boolean isAdmin = false;
	public boolean isSuperAdmin = false;
	/**
	 * 当前用户可见的用户（以下用户创建的数据，对当前用户可见）
	 */
	public String user_ids_cansee = "";
	/**
	 * 当前用户可见的组织（以下用户创建的数据，对当前用户可见）
	 * 该值来自角色，对应的role_org_ids. 
	 */
	public String org_ids_cansee = "";
	
	//todo 以后从servlet里取
	//private static String appUri = "/xinda";
	//当前用户可见的组织，来自角色中的数据权限。
	public List<SysOrg> orgList_cansee = new ArrayList();
	//当前用户可见的部门
	public List<SysOrg> depList_cansee = new ArrayList();
    //当前用户可见的中心
	public List<SysOrg> centerList_cansee = new ArrayList();
	
	private Map menuMap = new HashMap();
	
	private static Log log = LogFactory.getLog(UserInfo.class);
    /**
     * 当前一级菜单
     * 一级菜单ID， 1-20, 0代表首页
     */
	private int menu_id_lv1 = 0;
	
	private SysUser sysUser = null;
	/**
	 * 提取当前用户所属的直接组织(存入数据用)
	 * @return
	 */
	public String getMyDirectOrgIds(){
		if(sysOrgList==null){
			return "";
		}
		return ","+Tools.getIdsFromList(this.sysOrgList, "org_id")+",";
	}
	
	/**
	 * 取当前用户的末级组织
	 * @return
	 */
	public SysOrg getMyFinalOrg(){
		if(getMyOrg_DepD()!=null){
			return getMyOrg_DepD() ;
		}if(getMyOrg_Dep()!=null){
			return getMyOrg_Dep() ;
		}else if(getMyOrg_Center()!=null){
			return getMyOrg_Center() ;
		}else if(getMyOrg_Com()!=null){
			return getMyOrg_Com() ;
		}else if(this.getSysOrgList().size()>0){
			return getSysOrgList().get(0);
		}
		return null; 
	}
	/**
	 * 取当前用户所在的公司级组织
	 * @return
	 */
	public SysOrg getMyOrg_Com(){
		if(this.getSysOrgList_com().size()>0){
			return getSysOrgList_com().get(0);
		}
		return null;
	}
	/**
	 * 取当前用户所在的中心级组织
	 * @return
	 */
	public SysOrg getMyOrg_Center(){
		if(this.getSysOrgList_center().size()>0){
			return getSysOrgList_center().get(0);
		}
		return null;
	}
	/**
	 * 取当前用户所在的部门级组织
	 * @return
	 */
	public SysOrg getMyOrg_Dep(){
		if(this.getSysOrgList_dep().size()>0){
			return getSysOrgList_dep().get(0);
		}
		return null;
	}
	/**
	 * 取当前用户所在的部门级组织
	 * @return
	 */
	public SysOrg getMyOrg_DepD(){
		if(this.getSysOrgList_depd().size()>0){
			return getSysOrgList_depd().get(0);
		}
		return null;
	}
	/**
	 * 当前用户所具备的角色
	 */
	private List<SysRole> sysRoleList = new ArrayList();
	/**
	 * 当前用户所具备的组织
	 */
	private List<SysOrg> sysOrgList = new ArrayList();
	/**
	 * 当前用户所具备的部门类型的组织
	 */
	private List<SysOrg> sysOrgList_dep = new ArrayList();
	/**
	 * 当前用户所具备的部门组类型的组织
	 */
	private List<SysOrg> sysOrgList_depd = new ArrayList();
	/**
	 * 当前用户所具备的中心类型的组织
	 */
	private List<SysOrg> sysOrgList_center = new ArrayList();
	/**
	 * 当前用户所属的公司组的组织
	 */
	private List<SysOrg> sysOrgList_com = new ArrayList();
	/**
	 * 当前用户所具备的菜单
	 */
	private List<SysMenu> sysMenuList = new ArrayList();
	/**
	 * 当用户进入系统后，该值会被初始化，见：UserServlet::login
	 */
	public List<MenuTreeNode> menuTreeNodeList = new ArrayList();
	
	public List<MenuTreeNode> getMenuTreeNodeList() {
		return menuTreeNodeList;
	}

	public void setMenuTreeNodeList(List<MenuTreeNode> menuTreeNodeList) {
		this.menuTreeNodeList = menuTreeNodeList;
	}

	public String getUser_name(){
		return sysUser.getUser_name();
	}

	public List<SysMenu> getSysMenuList() {
		return sysMenuList;
	}

	public void setSysMenuList(List<SysMenu> sysMenuList) {
		this.sysMenuList = sysMenuList;
		for(int i=0; i<sysMenuList.size(); i++){
			menuMap.put(sysMenuList.get(i).getMenu_id()+"", sysMenuList.get(i));
		}
	}

	public List<SysRole> getSysRoleList() {
		return sysRoleList;
	}

	public void setSysRoleList(List<SysRole> sysRoleList) {
		this.sysRoleList = sysRoleList;
	}

	public SysUser getSysUser() {
		return sysUser;
	}

	public void setSysUser(SysUser sysUser) {
		this.sysUser = sysUser;
	}

	public int getMenu_id_lv1() {
		return menu_id_lv1;
	}

	public void setMenu_id_lv1(int menu_id_lv1) {
		this.menu_id_lv1 = menu_id_lv1;
	}
	
	/**
	 * 提取某个结点的二级结点
	 * @param menu_id
	 */
	public List <MenuTreeNode> getNodesLv2(int menu_id){
		for(int i=0; i<menuTreeNodeList.size(); i++){
			if(menuTreeNodeList.get(i).getMenu_id()==menu_id){
				return menuTreeNodeList.get(i).children;
			}
		}
		return null;
	}
	
	/**
	 * 提取某个结点的二级结点及以后的三级
	 * @param menu_id
	 */
	public String getNodesLv2Lv3ForKendo(int menu_id){
		for(int i=0; i<menuTreeNodeList.size(); i++){
			if(menuTreeNodeList.get(i).getMenu_id()==menu_id){
				return Tools.toJsonString( menuTreeNodeList.get(i).children);
				//return menuTreeNodeList.get(i).children;
			}
		}
		return null;
	}

	public List<SysOrg> getSysOrgList() {
		return sysOrgList;
	}

	public void setSysOrgList(List<SysOrg> sysOrgList) {
		this.sysOrgList = sysOrgList;
		//提取部门级的组织.
		this.genOrgList_dep();
	}
	/**
	 * 判断当前用户是否具备某种角色类别
	 * @param roletype_id  @see BPConstants.ROLETYPE
	 * @return
	 */
	public boolean hasRoleType(String roletype_id){
		String roletype_ids = ","+Tools.getIdsFromList(sysRoleList, "roletype_id")+",";
		//log.debug("roletype_ids = "+roletype_ids);
		if(roletype_ids.indexOf(","+roletype_id+",")>=0){
			return true;
		}
		return false;
	}
	/**
	 * 判断当前用户是否具备某种角色
	 * @param role_id  @see BPConstants.ROLE
	 * @return
	 */
	public boolean hasRole(String role_id){
		String role_ids = ","+Tools.getIdsFromList(sysRoleList, "role_id")+",";
		//log.debug("roletype_ids = "+roletype_ids);
		if(role_ids.indexOf(","+role_id+",")>=0){
			return true;
		}
		return false;
	}
//	/**
//	 * 判断当前用户是否为部门经理
//	 * @return
//	 */
//	public boolean isDepMananger(){
//		return this.hasRoleType(BPConstants.ROLETYPE_DEP_MANAGER);
//	}
//	/**
//	 * 判断当前用户是否为部门主管
//	 * @return
//	 */
//	public boolean isDepDirector(){
//		return this.hasRoleType(BPConstants.ROLETYPE_DEP_DIRECTOR);
//	}
//	
//	/** 
//	 * 判断当前用户是否为中心总监
//	 * @return
//	 */
//	public boolean isChiefMananger(){
//		return this.hasRoleType(BPConstants.ROLETYPE_CHIEF);
//	}
//	/**
//	 * 是否为总经理
//	 * @return
//	 */
//	public boolean isGeneralMananger(){
//		return this.hasRoleType(BPConstants.ROLETYPE_GENERALMANAGER);
//	}
//	/**
//	 * 判断当前用户是否为中心总监助理
//	 * @return
//	 */
//	public boolean isChiefAssi(){
//		return this.hasRoleType(BPConstants.ROLETYPE_CHIEF_ASSI);
//	}
//	/**
//	 * 判断当前用户是否为董事长助理,董事长助理,录入的数据要显示:   董事长费用预算计划, 资金计划
//	 * @return
//	 */
//	public boolean isChairmanAssi(){
//		return this.hasRoleType(BPConstants.ROLETYPE_CHAIRMAN_ASSI);
//	}
//	/**
//	 * 判断当前用户是否为董事长
//	 * @return
//	 */
//	public boolean isChairman(){
//		return this.hasRoleType(BPConstants.ROLETYPE_CHAIRMAN);
//	}
	/**
	 * 判断当前用户是否为管理员
	 * @return
	 */
	public boolean isAdmin(){
		return this.hasRoleType(BPConstants.ROLETYPE_SYSADMIN)
			  ||this.hasRoleType(BPConstants.ROLETYPE_XINDA_ADMIN) ;
	}
	
	public boolean isSuperAdmin(){
		return this.hasRoleType(BPConstants.ROLETYPE_SUPERADMIN) ;
	}
//	/**
//	 * 判断当前用户是否为部门主管
//	 * @return
//	 */
//	public boolean isDepDirector(){
//		String roles = BPConfiguration.getRoleDepDirector();
//		for(int i=0; i<sysRoleList.size(); i++){
//			SysRole sysRole = sysRoleList.get(i);
//			int role_id = sysRole.getRole_id();
//			if(roles.indexOf(","+role_id+",")>=0){
//				return true;
//			}
//		}
//		return false;
//	}
//	/**
//	 * 判断当前用户是否为中心总监
//	 * @return
//	 */
//	public boolean isChiefMananger(){
//		String chiefRoles = BPConfiguration.getRoleChief();
//		for(int i=0; i<sysRoleList.size(); i++){
//			SysRole sysRole = sysRoleList.get(i);
//			int role_id = sysRole.getRole_id();
//			if(chiefRoles.indexOf(","+role_id+",")>=0){
//				return true;
//			}
//		}
//		return false;
//	}
//	/**
//	 * 是否为总经理
//	 * @return
//	 */
//	public boolean isGeneralMananger(){
//		String generalManagerRoles = BPConfiguration.getRoleGeneralManager();
//		for(int i=0; i<sysRoleList.size(); i++){
//			SysRole sysRole = sysRoleList.get(i);
//			int role_id = sysRole.getRole_id();
//			if(generalManagerRoles.indexOf(","+role_id+",")>=0){
//				return true;
//			}
//		}
//		return false;
//	}
//	/**
//	 * 判断当前用户是否为中心总监助理
//	 * @return
//	 */
//	public boolean isChiefAssi(){
//		String chiefRolesAssi = BPConfiguration.getRoleChiefAssi();
//		for(int i=0; i<sysRoleList.size(); i++){
//			SysRole sysRole = sysRoleList.get(i);
//			int role_id = sysRole.getRole_id();
//			if(chiefRolesAssi.indexOf(","+role_id+",")>=0){
//				return true;
//			}
//		}
//		return false;
//	}
	
//	/**
//	 * 判断当前用户是否为董事长助理,董事长助理,录入的数据要显示:   董事长费用预算计划, 资金计划
//	 * @return
//	 */
//	public boolean isChairmanAssi(){
//		String chairmanRolesAssi = BPConfiguration.getRoleChairmanAssi();
//		for(int i=0; i<sysRoleList.size(); i++){
//			SysRole sysRole = sysRoleList.get(i);
//			int role_id = sysRole.getRole_id();
//			if(chairmanRolesAssi.indexOf(","+role_id+",")>=0){
//				return true;
//			}
//		}
//		return false;
//	}
	
	public void genOrgList_dep(){
		/**
		String org_level_dep = BPConfiguration.getOrg_Level_Dep();
		String org_level_depd = BPConfiguration.getOrg_Level_DepD();
		this.sysOrgList_dep = new ArrayList();
		for(int i=0; i<sysOrgList.size();i++){
			SysOrg sysOrg = sysOrgList.get(i);
			//计算所属的公司
			if(sysOrgList_com.size()==0){
			   String org_code = sysOrg.getOrg_code();
			   String com_code = org_code.substring(0, 2)+"0000000000";
			   SysOrg sysOrg_com = SysDaoFactory.getSysInfoDao().selectSysOrgByCode(com_code);
			   sysOrgList_com.add(sysOrg_com);
			   //sysOrgList_com
			}
			//中心级(如果把总监直接挂到了中心级组织下)
			if(String.valueOf(sysOrg.getOrg_level()).equalsIgnoreCase(BPConfiguration.getOrg_Level_Center())){
				if(sysOrgList_center.size()==0){
				   String org_code = sysOrg.getOrg_code();
				   String center_code = org_code.substring(0, 4)+"00000000";
				   SysOrg sysOrg_center = SysDaoFactory.getSysInfoDao().selectSysOrgByCode(center_code);
				   sysOrgList_center.add(sysOrg_center);
				}
			}
			//sysOrg.get
			//只挂到部门级的情况
			if(String.valueOf(sysOrg.getOrg_level()).equalsIgnoreCase(org_level_dep)){
				//取其上级组织的名称
				SysOrg parent = SysDaoFactory.getSysInfoDao().selectSysOrgById(sysOrg.getOrg_parent());
				sysOrg.setOrg_name_parent(parent.getOrg_name());
				this.sysOrgList_dep.add(sysOrg);
				//计算所属中心
				if(sysOrgList_center.size()==0){
				   String org_code = sysOrg.getOrg_code();
				   String center_code = org_code.substring(0, 4)+"00000000";
				   SysOrg sysOrg_center = SysDaoFactory.getSysInfoDao().selectSysOrgByCode(center_code);
				   sysOrgList_center.add(sysOrg_center);
				}
			}
			
			//只挂到主管级的情况
			if(String.valueOf(sysOrg.getOrg_level()).equalsIgnoreCase(org_level_depd)){
				//取其上级组织的名称-部门
				SysOrg parent = SysDaoFactory.getSysOrgDao().selectById(sysOrg.getOrg_parent());
				sysOrg.setOrg_name_parent(parent.getOrg_name());
				this.sysOrgList_depd.add(sysOrg);
				//计算所属部门
				if(sysOrgList_dep.size()==0){
				   String org_code = sysOrg.getOrg_code();
				   String dep_code = org_code.substring(0, 9)+"000000000";
				   SysOrg sysOrg_dep = SysDaoFactory.getSysOrgDao().selectByCode(dep_code);
				   sysOrgList_dep.add(sysOrg_dep);
				}
				//计算所属中心
				if(sysOrgList_center.size()==0){
				   String org_code = sysOrg.getOrg_code();
				   String center_code = org_code.substring(0, 6)+"000000000000";
				   SysOrg sysOrg_center = SysDaoFactory.getSysOrgDao().selectByCode(center_code);
				   sysOrgList_center.add(sysOrg_center);
				}
			}
		}
       **/
	}

	public List<SysOrg> getSysOrgList_dep() {
		return sysOrgList_dep;
	}

	public void setSysOrgList_dep(List<SysOrg> sysOrgList_dep) {
		this.sysOrgList_dep = sysOrgList_dep;
	}
	
	public static void main(String[] args){
//		//UserInfo info = new UserInfo();
//		UserBO userBO = new UserBO();
//		UserInfo userinfo  = new UserBO().genUserInfo("zhangl", "111111");
//		//String result = userinfo.getNodesLv2Lv3ForKendo(249);
//		//log.debug(result);
//		//Tools.toJsonString(userinfo.getSysOrgList_dep());
//		Tools.toJsonString(userinfo.getSysRoleList());
	}

	public List<SysOrg> getSysOrgList_com() {
		return sysOrgList_com;
	}

	public void setSysOrgList_com(List<SysOrg> sysOrgList_com) {
		this.sysOrgList_com = sysOrgList_com;
	}

	public List<SysOrg> getSysOrgList_center() {
		return sysOrgList_center;
	}

	public void setSysOrgList_center(List<SysOrg> sysOrgList_center) {
		this.sysOrgList_center = sysOrgList_center;
	}
	public String getUser_ids_cansee() {
		return user_ids_cansee;
	}
	public void setUser_ids_cansee(String user_ids_cansee) {
		this.user_ids_cansee = user_ids_cansee;
	}
	public String getOrg_ids_cansee() {
		return org_ids_cansee;
	}
	public void setOrg_ids_cansee(String org_ids_cansee) {
		this.org_ids_cansee = org_ids_cansee;
		
	}
	public List<SysOrg> getOrgList_cansee() {
		return orgList_cansee;
	}
	/**
	 * 设置当前用户可见的组织，包括，中心， 部门
	 * @param orgList_cansee 参数来自 UserBO.genUserInfo
	 */
	public void setOrgList_cansee(List<SysOrg> orgList_cansee) {
		//设置当前用户可见的组织，包括，中心， 部门
		this.orgList_cansee = orgList_cansee;
		for(int i=0; i<orgList_cansee.size(); i++){
			SysOrg sysOrg = orgList_cansee.get(i);
			String org_code = sysOrg.getOrg_code();
			int grade = Tools.getCodeGrade(org_code, 2);
			if((grade+"").equalsIgnoreCase(BPConstants.ORG_LEVEL_DEP)){
				depList_cansee.add(sysOrg);
			}else if((grade+"").equalsIgnoreCase(BPConstants.ORG_LEVEL_CENTER)){
				centerList_cansee.add(sysOrg);
			}
		}
	}
	public List<SysOrg> getCenterList_cansee() {
		return centerList_cansee;
	}
	public void setCenterList_cansee(List<SysOrg> centerList_cansee) {
		this.centerList_cansee = centerList_cansee;
	}
	public List<SysOrg> getDepList_cansee() {
		return depList_cansee;
	}
	public void setDepList_cansee(List<SysOrg> depList_cansee) {
		this.depList_cansee = depList_cansee;
	}
	/**
	 * 从当前用户所具有的菜单中依据菜单ID提取菜单对象
	 * 使用者:数据权限-baseservlet
	 * @param menu_id
	 * @return
	 */
	public SysMenu getMenuFromMap(String menu_id){
		if(menuMap.get(menu_id+"")==null){
			return null;
		}
		return (SysMenu)menuMap.get(menu_id+""); 
	}
	/**
	 * 判断当前用户是否可以执行某个操作,前台用户可用此方法判断
	 * @param mid 菜单ID,所有页面都有该变量
	 * @param oper_name 操作的中文名或者英文名
	 *        1查看 sel, 2增加 add, 3修改 upt, 4删除 del,5打印 prt, 6导出 exp, 7导入 imp
	 * @return
	 */
	public boolean canOper(String mid, String oper_name){
		return true;
//		SysMenu sysMenu = this.getMenuFromMap(mid);
//		String oper = sysMenu.getOper();
//		return OperBO.canOper(oper, oper_name);
	}
	
	private String ip="";

	public String getIp() {
		return ip;
	}
	public void setIp(String ip) {
		this.ip = ip;
	}
	
	//委托相关信息,如果当前用户是以委托形式登陆别人的账号,那么以前就是该用户自己的相关信息
		public int auth_user_id;
		public String auth_user_name;
		public String auth_user_sname;

		public int getAuth_user_id() {
			return auth_user_id;
		}
		public void setAuth_user_id(int auth_user_id) {
			this.auth_user_id = auth_user_id;
		}
		public String getAuth_user_name() {
			return auth_user_name;
		}
		public void setAuth_user_name(String auth_user_name) {
			this.auth_user_name = auth_user_name;
		}
		public String getAuth_user_sname() {
			return auth_user_sname;
		}
		public void setAuth_user_sname(String auth_user_sname) {
			this.auth_user_sname = auth_user_sname;
		}
		public List<SysOrg> getSysOrgList_depd() {
			return sysOrgList_depd;
		}
		public void setSysOrgList_depd(List<SysOrg> sysOrgList_depd) {
			this.sysOrgList_depd = sysOrgList_depd;
		}
		
		
	
	
}
